package cn.lijiguo.concurrency.threadpool;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * <pre>无界线程池 newCachedThreadPool</pre>
 * <p>
 *      Java Executor框架提供的一个工厂方法，用户创建一个根据需要创建新线程的线程池
 *      这种线程池在执行任务之前会尝试调用现有的空闲线程
 *      如果没有可用的线程,则会创建新的线程
 *      如果线程在60秒内没有被使用，它将被终止并从缓存中移除
 * <p>
 *      缓存线程池适用于处理大量的短生命周期任务，因为它可以根据需要动态的调整线程池的大小
 *      避免了创建过多线程导致资源的浪费问题
 * <p>
 *      优点：
 *          <li>1、动态调整线程数量</li>
 *          <li>2、任务处理速度快</li>
 *      缺点：
 *          <li>1、可能导致资源耗尽</li>
 *          <li>2、可能导致过度竞争</li>
 *          <li>3、可能导致任务堆积</li>
 *          <li>4、不适用于长期运行的任务</li>
 * <p><b>
 *     无界线程池适用于任务短暂，处理速度快的场景
 *
 * @author lijiguo
 */
@Slf4j
public class CachedThreadPoolDemo {

    public static void main(String[] args) {
        // 创建一个根据需要创建新线程的缓存线程池
        ExecutorService executorService = Executors.newCachedThreadPool();

        // 提交一些任务给线程池
        for (int i = 0; i < 5; i++) {
            final int taskId = i;
            executorService.submit(() -> {
                log.info("Task " + taskId + " is executing by " + Thread.currentThread().getName());
                try {
                    // 模拟任务执行
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    log.error(e.getMessage(), e);
                    Thread.currentThread().interrupt();
                }
            });
        }

        // 关闭线程池
        executorService.shutdown();
    }

}
